package com.huaxiafinance.management.util;


import java.util.Random;


public class RandomString
{
    private static final char[] ALPHA_RANGE = {'A', 'Z', 'a', 'z'};

    private static final char[] ALPHA_NUMERIC_RANGE = {'0', '9', 'A', 'Z', 'a', 'z'};

    private static final char[] CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();

    private static final RandomString INSTANCE = new RandomString();

    private static final Random rnd = new Random();

    public static RandomString getInstance()
    {
        return INSTANCE;
    }

    public static String random(int count, char[] chars)
    {
        if (count == 0)
        {
            return "";
        }
        char[] result = new char[count];
        while (count-- > 0)
        {
            result[count] = chars[rnd.nextInt(chars.length)];
        }
        return new String(result);
    }

    public static String random(int count, String chars)
    {
        return random(count, chars.toCharArray());
    }

    public static String random(int count, char start, char end)
    {
        if (count == 0)
        {
            return "";
        }
        char[] result = new char[count];
        int len = end - start + 1;
        while (count-- > 0)
        {
            result[count] = ((char)(rnd.nextInt(len) + start));
        }
        return new String(result);
    }

    public static String randomAscii(int count)
    {
        return random(count, ' ', '~');
    }

    public static String randomNumeric(int count)
    {
        return random(count, '0', '9');
    }

    public static String randomRanges(int count, char[] ranges)
    {
        if (count == 0)
        {
            return "";
        }
        int i = 0;
        int len = 0;
        int[] lens = new int[ranges.length];
        while (i < ranges.length)
        {
            int gap = ranges[(i + 1)] - ranges[i] + 1;
            len += gap;
            lens[i] = len;
            i += 2;
        }

        char[] result = new char[count];
        while (count-- > 0)
        {
            char c = '\000';
            int r = rnd.nextInt(len);
            for (i = 0; i < ranges.length; i += 2)
            {
                if (r < lens[i])
                {
                    r += ranges[i];
                    if (i != 0)
                    {
                        r -= lens[(i - 2)];
                    }
                    c = (char)r;
                    break;
                }
            }
            result[count] = c;
        }
        return new String(result);
    }

    public static String randomAlpha(int count)
    {
        return randomRanges(count, ALPHA_RANGE);
    }

    public static String randomAlphaNumeric(int count)
    {
        return randomRanges(count, ALPHA_NUMERIC_RANGE);
    }

    public static String randomBase64(int count)
    {
        return random(count, CHARS);
    }
}